home *** CD-ROM | disk | FTP | other *** search
- /*
- * Macintosh version of UNIX directory access package
- * (opendir, readdir, closedir).
- * Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
- */
-
- #include "dirent.h"
- #include "macdefs.h"
-
- static DIR opened;
-
- /*
- * Open a directory. This means calling PBOpenWD.
- * The value returned is always the address of opened, or NULL.
- * (I have as yet no use for multiple open directories; this could
- * be implemented by allocating memory dynamically.)
- */
-
- DIR *
- opendir(path)
- char *path;
- {
- union {
- WDPBRec d;
- VolumeParam v;
- } pb;
- char ppath[MAXPATH];
- short err;
-
- if (opened.nextfile != 0) {
- errno = EBUSY;
- return NULL; /* A directory is already open. */
- }
- strncpy(ppath+1, path, ppath[0]= strlen(path));
- pb.d.ioNamePtr= (unsigned char *)ppath;
- pb.d.ioVRefNum= 0;
- if (hfsrunning()) {
- pb.d.ioWDProcID= 0;
- pb.d.ioWDDirID= 0;
- err= PBOpenWD((WDPBPtr)&pb, FALSE);
- }
- else {
- pb.v.ioVolIndex= 0;
- err= PBGetVInfo((ParmBlkPtr)&pb, FALSE);
- }
- if (err != noErr) {
- errno = ENOENT;
- return NULL;
- }
- opened.dirid= pb.d.ioVRefNum;
- opened.nextfile= 1;
- return &opened;
- }
-
- /*
- * Close a directory.
- */
-
- void
- closedir(dirp)
- DIR *dirp;
- {
- if (hfsrunning()) {
- WDPBRec pb;
-
- pb.ioVRefNum= dirp->dirid;
- (void) PBCloseWD(&pb, FALSE);
- }
- dirp->dirid= 0;
- dirp->nextfile= 0;
- }
-
- /*
- * Read the next directory entry.
- */
-
- struct dirent *
- readdir(dp)
- DIR *dp;
- {
- union {
- DirInfo d;
- FileParam f;
- HFileInfo hf;
- } pb;
- short err;
- static struct dirent dir;
-
- dir.d_name[0]= 0;
- pb.d.ioNamePtr= (unsigned char *)dir.d_name;
- pb.d.ioVRefNum= dp->dirid;
- pb.d.ioFDirIndex= dp->nextfile++;
- pb.d.ioDrDirID= 0;
- if (hfsrunning())
- err= PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
- else
- err= PBGetFInfo((ParmBlkPtr)&pb, FALSE);
- if (err != noErr) {
- errno = EIO;
- return NULL;
- }
- (void) p2cstr((unsigned char *)dir.d_name);
- return &dir;
- }
-